﻿Imports System.Data.Entity

''' <summary>
''' Базовый класс для контроллеров, реализующих визуализацию статичных страниц.
''' </summary>
Public MustInherit Class PageBaseController
    Inherits DataBaseController

#Region "Методы"

    ''' <summary>
    ''' Создает объект <see cref="ViewResult" />, который выполняет визуализацию модели <see cref="Page" /> в представление.
    ''' </summary>
    ''' <returns>Результат представления, выполняющий визуализацию представления в ответ.</returns>
    ''' <remarks></remarks>
    Protected Friend Function PageView() As ViewResult
        Dim actionName As String = Request.RequestContext.RouteData.Values("action")
        Dim controllerName As String = Request.RequestContext.RouteData.Values("controller")

        Dim page As Page = GetPage(actionName, controllerName)

        'Выводим в преопределенный динамический словарь данные модели.
        ViewBag.Title = page.Title
        ViewBag.EditUrl = Url.Action("edit", "pages", New With {.id = page.Id, .area = "admin", .returnUrl = Url.Action(actionName, controllerName)})

        Return View(page)
    End Function

#End Region

#Region "Вспомогательные методы"

    ''' <summary>
    ''' Получает из источника данных объект <see cref="Page" />, определяя его по имени действия и имени контроллера.
    ''' </summary>
    ''' <param name="actionName">Имя действия.</param>
    ''' <param name="controllerName">Имя контроллера.</param>
    ''' <returns>Объект <see cref="Page" />.</returns>
    ''' <remarks>
    ''' Если в источнике данных отсутствует запись о запрашиваемом объекте, то данная функция создает и возвращает новый объект <see cref="Page" />, сохраняя его в источнике.
    ''' </remarks>
    Private Function GetPage(actionName As String, controllerName As String) As Page
        Dim model As Page = Db.Pages.SingleOrDefault(Function(m) m.ActionName.Equals(actionName) And m.ControllerName.Equals(controllerName))

        'Если в базе данных отсутствует нужная модель, то она будет создана и сохранена в базе.
        If IsNothing(model) Then
            model = Db.Pages.Add(New Page With {.Id = Guid.NewGuid, .Title = actionName, .ActionName = actionName.ToLower, .ControllerName = controllerName.ToLower})
            Db.SaveChanges()
        End If

        Return model
    End Function

#End Region
End Class